Prevendo preços de carros com estatística

Seminário de modelos lineares

Davi, Diogo, João, Thiago e Eduardo Garcez

2025-01-08

Introdução

O dataset foi escolhido pela plataforma kaggle e trata de observações sobre o mercado automotivo online da Georgia 🇬🇪 no ano de 2024.

País localizado no cáucaso com cerca de 3,7 milhões de habitantes.

Conforme o schema apresentado a seguir o dataset apresenta diversos detalhes sobre as vendas, condições do carro e outros detalhes mais específicos.

Para esse trabalho, com o intuito de enfatizar os processos e análises que foram aprendidos na disciplina, tomamos liberdade de manipular o banco fornecido no site e descosiderar variáveis não utilizadas no modelo.


Abaixo também apresentamos uma tabela com as variáveis que escolhemos enfatizar e serão tratadas no modelo linear simulado.

Explorando o banco de dados

Nos moldes que foram aplicados temos 54112 registros a serem analisados.

Estatísticas gerais


Quantitativas

Visão geral de variáveis quantitativas;

price car_run_km prod_year engine_volume cylinders airbags
min 1020.0 1006.0 1911.00 1.00 1.00 0.00
max 8388607.0 1599998.0 2024.00 20000.00 12.00 12.00
median 7500.0 139200.0 2015.00 2000.00 4.00 9.00
mean 11210.5 149775.2 2013.50 2349.74 4.64 8.43
var 1502001894.7 9915531471.5 43.96 1089134.11 1.95 11.57

Categorias

Principais categorias de carros;

category count mean_price
Sedan 22048 9921.851
Jeep 15961 15821.028
Hatchback 7869 5655.509
Coupe 1702 13819.976
Minivan 1448 8790.843
Goods wagon 1196 6283.490

Montadoras

Montadoras com mais registros;

man_name count mean_price
Toyota 9042 11255.517
Mercedes-Benz 6598 15656.034
BMW 4709 15227.045
Ford 4504 7525.568
Hyundai 3005 9070.884
Honda 2834 6313.229
Nissan 2607 5574.705
Volkswagen 2531 7754.279
Subaru 2018 8295.811
Lexus 1810 20302.830

Representações gráficas


Preço

Ano de Fabricação

Características específicas

Equação do modelo linear

A equação do modelo linear é dada por:

\[ \text{price} = \beta_0 + \beta_1 \cdot \text{car_run_km} + \beta_2 \cdot \text{prod_year} + \beta_3 \cdot \text{engine_volume} + \beta_4 \cdot \text{cylinders} + \beta_5 \cdot \text{airbags} + \beta_6 \cdot \text{abs_break} + \beta_7 \cdot \text{esd} + \\ \beta_8 \cdot \text{el_windows} + \beta_9 \cdot \text{conditioner} + \beta_10 \cdot \text{leather} + \beta_11 \cdot \text{nav_system} \]

#> 
#> Call:
#> lm(formula = price ~ car_run_km + prod_year + engine_volume + 
#>     cylinders + airbags + abs_break + esd + el_windows + conditioner + 
#>     leather + nav_system, data = data_filter)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#>  -44074   -5005   -1857    1831 8376743 
#> 
#> Coefficients:
#>                   Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)     -1.284e+06  6.463e+04 -19.862   <2e-16 ***
#> car_run_km      -2.199e-02  1.861e-03 -11.813   <2e-16 ***
#> prod_year        6.386e+02  3.210e+01  19.896   <2e-16 ***
#> engine_volume    2.484e+00  2.242e-01  11.079   <2e-16 ***
#> cylinders        1.681e+03  1.683e+02   9.984   <2e-16 ***
#> airbags         -4.221e+02  5.515e+01  -7.652    2e-14 ***
#> abs_breakTRUE    1.596e+03  8.257e+02   1.933   0.0532 .  
#> esdTRUE          8.556e+01  7.203e+02   0.119   0.9054    
#> el_windowsTRUE   1.479e+03  1.042e+03   1.420   0.1557    
#> conditionerTRUE -1.146e+03  9.856e+02  -1.163   0.2448    
#> leatherTRUE      1.116e+04  3.815e+04   0.293   0.7699    
#> nav_systemTRUE   1.321e+03  5.371e+02   2.459   0.0139 *  
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 38150 on 54100 degrees of freedom
#> Multiple R-squared:  0.03124,    Adjusted R-squared:  0.03104 
#> F-statistic: 158.6 on 11 and 54100 DF,  p-value: < 2.2e-16

Apenas algumas variáveis apresentaram significância no modelo. Assim, o próximo modelo será construído excluindo as variáveis com p-valor maior que 0,05

#> 
#> Call:
#> lm(formula = price ~ car_run_km + prod_year + engine_volume + 
#>     cylinders + airbags + abs_break + nav_system, data = data_filter)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#>  -44011   -5008   -1852    1830 8376710 
#> 
#> Coefficients:
#>                  Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)    -1.275e+06  6.395e+04 -19.940  < 2e-16 ***
#> car_run_km     -2.198e-02  1.860e-03 -11.815  < 2e-16 ***
#> prod_year       6.344e+02  3.177e+01  19.970  < 2e-16 ***
#> engine_volume   2.478e+00  2.237e-01  11.076  < 2e-16 ***
#> cylinders       1.682e+03  1.682e+02  10.001  < 2e-16 ***
#> airbags        -4.231e+02  5.482e+01  -7.717 1.21e-14 ***
#> abs_breakTRUE   1.905e+03  5.250e+02   3.628 0.000286 ***
#> nav_systemTRUE  1.389e+03  4.894e+02   2.837 0.004551 ** 
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 38150 on 54104 degrees of freedom
#> Multiple R-squared:  0.0312, Adjusted R-squared:  0.03107 
#> F-statistic: 248.9 on 7 and 54104 DF,  p-value: < 2.2e-16

Interpretação dos Coeficientes

\[ \text{price} = \beta_0 + \beta_1 \cdot \text{car_run_km} + \beta_2 \cdot \text{prod_year} + \beta_3 \cdot \text{engine_volume} + \beta_4 \cdot \text{cylinders} + \beta_5 \cdot \text{airbags} + \beta_6 \cdot \text{abs_break} + \beta_7 \cdot \text{nav_system} \]

  • \(\beta_0\) (intercept) nos indica que o valor esperado do veículo quando todas variáveis independentes são iguais a zero. Logo o beta_0 não tem interpretação prática pois o ano de produção não pode ser 0.

  • car_run_km (Quilometragem): Para cada quilômetro adicional rodado, o preço do veículo diminuí em média -0.02 unidades monetárias, mantendo todas as outras variáveis constantes.

  • prod_year (Ano de produção): Para cada ano adicional de produção, o preço do veículo aumenta em média 634.40 unidades monetárias, mantendo todas as outras variáveis constantes.

  • engine_volume (volume do motor) : Para cada unidade adicional no volume do motor, o preço do veículo aumenta em média 2.47 unidades monetárias, mantendo todas as outras variáveis constantes.

  • cylinders (cilindro adicional): Para cada cilindro adicional, o preço do veículo aumenta em média 1682.0 unidades monetárias, mantendo todas as outras variáveis constantes.

  • airbags Para cada airbags, o preço do veículo diminui em média -423.1 unidades monetárias, mantendo todas as outras variáveis constantes.

  • abs_break (Sistema de freio) Para presença de ABS, o aumento esperado na variável resposta é 1905 unidades monetárias, mantendo todas as outras variáveis constantes.

  • nav_system (Sistema de navegação) Para presença de Sistema de navegação, o aumento esperado na variável resposta é 1389 unidades monetárias, mantendo todas as outras variáveis constantes.

Interpretação do teste F

F-statistic: 248.9
p-valor: < 2.2e-16
Adjusted R-squared: 0.03107

  • F-statistic: O valor de 248.9 indica que a variabilidade explicada pelo modelo é significativamente maior do que a variabilidade não explicada. Em outras palavras, o modelo como um todo é significativo.

  • p-valor: O p-valor é extremamente pequeno (< 2.2e-16), o que significa que a probabilidade de observar um valor de F tão extremo, ou mais extremo, sob a hipótese nula é praticamente zero.

  • Adjusted R-squared: Apenas cerca de 3.1% da variabilidade dos dados observados é explicada pelo modelo ajustado.

  • Conclusão: Apesar do modelo ser estatisticamente significativo como um todo, com um p-valor extremamente pequeno (< 2.2e-16), sua capacidade explicativa é muito limitada, conforme evidenciado pelo \(R^2\) ajustado de apenas 3.1%. Isso indica que o modelo consegue explicar apenas uma pequena fração da variabilidade nos preços dos carros.

    Portanto, prosseguiremos com a análise detalhada dos resíduos, buscando identificar possíveis outliers ou padrões que possam estar influenciando negativamente o desempenho do modelo e comprometendo sua capacidade preditiva.

Voltando a equação…

\[ \text{price} = \beta_0 + \beta_1 \cdot \text{car_run_km} + \beta_2 \cdot \text{prod_year} + \beta_3 \cdot \text{engine_volume} + \beta_4 \cdot \text{cylinders} + \beta_5 \cdot \text{airbags} + \beta_6 \cdot \text{abs_break} + \beta_7 \cdot \text{nav_system} \] Substituindo os valores dos coeficientes estimados, temos:

\[ \begin{align*} \text{price} = &\ -1,275,000 - 0.02198 \cdot \text{car_run_km} + 634.4 \cdot \text{prod_year} + 2.478 \cdot \text{engine_volume} \\ &+ 1,682 \cdot \text{cylinders} - 423.1 \cdot \text{airbags} + 1,905 \cdot \text{abs_break} + 1,389 \cdot \text{nav_system} \end{align*} \]

Multicolinearidade

Verificando correlações

Cilindros X Volume do motor

Freios ABS X Sistema de navegação

VIF

VIF
car_run_km 1.276091
prod_year 1.649412
engine_volume 2.026582
cylinders 2.046492
airbags 1.292736
abs_break 1.936921
nav_system 2.093494

Com base nas correlações e os baixos valores de VIF (entre 1 e 2), isso evidencia que a multicolinearidade não é um problema relevante neste modelo, pois, embora algumas variáveis apresentem covariância moderadas entre si, elas não estão inflacionando a variância dos coeficientes.

Análise de resíduos

Identificação de Outliers por análise de resíduos padronizados

#>    11    55    77   162   180   378   379   380   407   795  1456  1457  2197 
#>    11    55    77   162   180   378   379   380   407   795  1456  1457  2197 
#>  2219  2373  2383  3099  5535  8868 14042 14052 14241 15242 15247 15327 15336 
#>  2219  2373  2383  3099  5535  8868 14042 14052 14241 15242 15247 15327 15336 
#> 15337 16088 16264 16487 16490 17983 20884 23403 23404 24830 25049 25058 27021 
#> 15337 16088 16264 16487 16490 17983 20884 23403 23404 24830 25049 25058 27021 
#> 27495 27543 28364 28381 31189 31565 32687 33664 34315 34755 36383 36384 36386 
#> 27495 27543 28364 28381 31189 31565 32687 33664 34315 34755 36383 36384 36386 
#> 36390 36391 36445 36999 37451 38094 38973 39254 39255 42011 42024 42526 43304 
#> 36390 36391 36445 36999 37451 38094 38973 39254 39255 42011 42024 42526 43304 
#> 45123 46478 46893 46973 46975 47169 47312 47342 48361 49130 50495 51421 52781 
#> 45123 46478 46893 46973 46975 47169 47312 47342 48361 49130 50495 51421 52781 
#> 52782 53177 53708 53911 
#> 52782 53177 53708 53911
#> [1] 82
  • A análise dos resíduos padronizados revelou a presença de 82 outliers, o que evidencia inconsistências nos dados ou no ajuste do modelo, indicando que ele não captura adequadamente a variabilidade dos dados.

Gráfico de Resíduos vs Ajustados

  • O gráfico de Resíduos vs Valores Ajustados apresenta uma distribuição heterogênea, com maior dispersão dos resíduos em valores ajustados mais altos, em torno de 25.000, identificando três outliers principais, sendo um outlier extremo acima de 8 milhões de dólares, que pode ser um erro de registro ou representar uma característica excepcional do banco de dados.
  • Podemos ver que a variância claramente aumenta para valores ajustados extremos, mas não há um padrão claro de curva ou tendência nos resíduos que sugira forte não linearidade.

Teste de Breusch-Pagan para Heterocedasticidade

#> 
#>  studentized Breusch-Pagan test
#> 
#> data:  model_filter
#> BP = 15.504, df = 7, p-value = 0.03006
  • Portanto, o p-valor menor que 0,05 indica que há evidências de heterocedasticidade nos resíduos do modelo, isto é, de que a variância dos resíduos não é constante.
  • A heterocedasticidade visual identificada é confirmada pelo teste de Breusch-Pagan, que rejeitou a hipótese nula de que os resíduos estejam distribuídos uniformemente ao longo do gráfico de forma homocedástica, com variância constante.
  • Em teoria, os resíduos devem ter média zero, mas, como podemos ver, os resíduos não estão perfeitamente equilibrados em torno da linha horizontal, em y = 0, o que indica que a relação entre as variáveis explicativas e a resposta não foi totalmente capturada pelo modelo, que necessita ter seu ajuste melhorado.

QQ-Plot

  • Os resíduos mostram desvios significativos nas caudas em relação à distribuição normal, indicando violação da suposição de normalidade, possivelmente relacionada à presença de outliers, como os identificados pelos índices 45123 e 14042 ou à variabilidade não explicada adequadamente pelo modelo.

Teste de Durbin-Watson

Teste para verificar autocorrelação nos resíduos:

#> 
#>  Durbin-Watson test
#> 
#> data:  model_filter
#> DW = 1.9792, p-value = 0.007806
#> alternative hypothesis: true autocorrelation is greater than 0
  • O p-valor significativo sugere uma leve autocorrelação positiva, o que vai contra o princípio de independência entre os resíduos. No entanto, dado que o DW está quase em 2, essa autocorrelação pode não ser severa o suficiente para impactar gravemente as inferências do modelo.

Scale-Location

  • O gráfico destaca que os valores do desvio padrão dos resíduos aumentam à medida que os valores ajustados crescem, confirmando a variância não constante observada. Isso pode ter ocorrido por conta de variáveis preditivas que deixamos de considerar.

Pontos Influentes

#> 45123 
#> 45123
#> [1] 1

  • Utilizando a Distância de Cook, são destacadas observações com valores superiores a 4/n, sendo n o número de observações do banco filtrado. O ponto 45123 apresentou um valor elevado, indicando que, além de ser um outlier, exerce uma influência exagerada no modelo. Esse comportamento pode distorcer as estimativas dos coeficientes de regressão e a inferência.

Pontos de Alavanca

#> [1] 3226
  • Sobre os pontos de alavanca, foram identificadas 3226 observações com alta alavancagem, indicando que essas observações têm grande influência no ajuste do modelo devido à sua distância da média das variáveis explicativas. Essa quantidade significativa de pontos sugere um impacto relevante na estrutura do modelo e na estimativa dos coeficientes, o que pode alterar a interpretação dos resultados e reforça a necessidade de verificar a adequação do modelo às características dos dados.

  • No gráfico Resíduos vs Leverage, é possível observar que algumas dessas observações, como os pontos destacados, também são outliers, sendo que o ponto 45123 se destaca por também ser ponto influente. Esses pontos combinam alavancagem elevada e um grande peso nos resíduos, impactando a estabilidade do modelo.

Transformação em log escala

dois modelos lineares foram ajustados com o objetivo de linearizar relações não lineares presentes nos dados e reduzir os efeitos de heterocedasticidade, buscando uma maior precisão nas estimativas.

O primeiro modelo foi ajustado utilizando a transformação logarítmica na variável dependente \(log(price)\), enquanto as variáveis independentes permaneceram em sua escala original:

#> 
#> Call:
#> lm(formula = log(price) ~ car_run_km + prod_year + cylinders + 
#>     airbags + abs_break + nav_system, data = data_filter)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -2.7563 -0.3448 -0.0139  0.3284  6.9267 
#> 
#> Coefficients:
#>                  Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)    -9.485e+01  1.024e+00  -92.64   <2e-16 ***
#> car_run_km     -1.055e-06  2.972e-08  -35.49   <2e-16 ***
#> prod_year       5.114e-02  5.086e-04  100.56   <2e-16 ***
#> cylinders       1.745e-01  1.931e-03   90.35   <2e-16 ***
#> airbags        -1.793e-02  8.777e-04  -20.43   <2e-16 ***
#> abs_breakTRUE   1.753e-01  8.377e-03   20.93   <2e-16 ***
#> nav_systemTRUE  3.068e-01  7.831e-03   39.17   <2e-16 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 0.611 on 54105 degrees of freedom
#> Multiple R-squared:  0.4169, Adjusted R-squared:  0.4169 
#> F-statistic:  6448 on 6 and 54105 DF,  p-value: < 2.2e-16

O segundo modelo também utilizou a transformação logarítmica na variável dependente \(log(price)\). Contudo, adicionalmente, a transformação logarítmica foi aplicada na variável independente “quilometragem rodada pelo carro”:

#> 
#> Call:
#> lm(formula = log(price) ~ log(car_run_km) + prod_year + cylinders + 
#>     airbags + abs_break + nav_system, data = data_filter)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -2.9795 -0.3372 -0.0052  0.3284  6.9039 
#> 
#> Coefficients:
#>                   Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)     -8.863e+01  1.005e+00  -88.16   <2e-16 ***
#> log(car_run_km) -1.679e-01  3.163e-03  -53.09   <2e-16 ***
#> prod_year        4.894e-02  4.936e-04   99.14   <2e-16 ***
#> cylinders        1.744e-01  1.904e-03   91.62   <2e-16 ***
#> airbags         -1.611e-02  8.665e-04  -18.59   <2e-16 ***
#> abs_breakTRUE    1.840e-01  8.265e-03   22.27   <2e-16 ***
#> nav_systemTRUE   3.145e-01  7.714e-03   40.77   <2e-16 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 0.6026 on 54105 degrees of freedom
#> Multiple R-squared:  0.4329, Adjusted R-squared:  0.4328 
#> F-statistic:  6883 on 6 and 54105 DF,  p-value: < 2.2e-16
  • Manutenção de Outliers: Nenhum tratamento foi realizado para remover ou ajustar outliers presentes no conjunto de dados. Todas as observações originais foram mantidas no ajuste dos modelos.

Análise de resíduos

Gráfico de Resíduos vs Ajustados

- A curva azul indica que os resíduos seguem um padrão não aleatório, formando uma curvatura (no formato de “U”).Isso sugere que o modelo pode não estar capturando bem a relação entre as variáveis preditoras e a variável resposta. Um modelo linear pode não ser a melhor escolha

QQ-Plot

  • Os resíduos mostram desvios significativos nas caudas em relação à distribuição normal.

Scale-Location

  • A heterocedasticidade observada indica que os pressupostos de variância constante dos resíduos do modelo linear não são atendidos

Teste de Breusch-Pagan para Heterocedasticidade

#> 
#>  studentized Breusch-Pagan test
#> 
#> data:  model_log2
#> BP = 3699.5, df = 6, p-value < 2.2e-16
  • Portanto, o p-valor menor que 0,05 indica que há evidências de heterocedasticidade nos resíduos do modelo, isto é, de que a variância dos resíduos não é constante.

Conclusão

  • A transformação log não foi suficiente: Apesar de o logaritmo reduzir a escala e estabilizar a variância em muitos casos, ele pode não corrigir completamente a heterocedasticidade ou a não linearidade.

  • Pode ser que a relação entre as variáveis explicativas (log(car_run_km), prod_year, etc.) e a variável resposta ainda não seja bem representada por um modelo linear.

  • Outliers podem estar influenciando a análise e distorcendo os resultados do modelo.